AWSサポート関連の情報(Support Case & Trusted Advisor)にAPIアクセスする
サポート情報にAPIアクセスする
世の中にある様々な商品やサービスのサポート情報へのアクセスは、電話・メール・対面など、何かしら人が対応する必要があり、多少の工数追加は仕方ないと思う方も多いのではないでしょうか。AWSは、全てのリソースへのアクセスにAPIを用意するという理念の下(私が勝手に想像しましたw )、あらゆるサービスにAPIを用意しています。このたび、AWSサポートのビジネスとエンタープライズ向けにAWSサポート関連の情報へアクセスするためにAPIが用意されました!
用意されているAPI
現在公開されているAWSサポート情報アクセスのAPIはいかになります。
- Support Case Management
- AWS Trusted Advisor
Support Case Management
- サポートケースをオープン
- 一覧と詳細の表示
- 解決済みを含む、日付や文字列による検索
- やり取りしたり、連絡先のメールアドレスを記述
- サポートケースを解決
AWS Trusted Advisor
- チェック項目と名前の取得
- アカウントとリソースに対してチェックを依頼
- サマリーや詳細情報を取得
- チェックの更新依頼
- それぞれのチェックのステータスを取得
サポートケースに関するAPI
サービスとカテゴリ一覧
サポートケースを作成する際に、サービス名とカテゴリを指定します。どんなものが指定できるのか確認してみましょう。
import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.Category; import com.amazonaws.services.support.model.DescribeServicesRequest; import com.amazonaws.services.support.model.DescribeServicesResult; import com.amazonaws.services.support.model.Service; public class AWSSupportApp { public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); DescribeServicesRequest request = new DescribeServicesRequest(); request.withLanguage("ja"); DescribeServicesResult result = support.describeServices(request); for (Service service : result.getServices()) { System.out.println("サービス名 : " + service.getName() + "(" + service.getCode() + ")"); for (Category category : service.getCategories()){ System.out.println(" カテゴリ名 : " + category.getName() + "(" + category.getCode() + ")"); } } } }
実行結果は以下です。(件数が多いため省略して表示しています。)
・・・ サービス名 : Elastic Compute Cloud (EC2 - Linux)(amazon-elastic-compute-cloud-linux) カテゴリ名 : その他(other) カテゴリ名 : 新機能・改善のご要望(feature-request) カテゴリ名 : APIs(apis) カテゴリ名 : 一般的なご質問(general-guidance) カテゴリ名 : インスタンス関連(instance-issue) カテゴリ名 : Apache(apache) カテゴリ名 : ディスクの設定(disk-configurations) カテゴリ名 : Eメールサービス(email-services) カテゴリ名 : FTP(ftp) カテゴリ名 : MySQL(mysql) カテゴリ名 : VPNソリューション(vpn-solutions) カテゴリ名 : 予定されたイベント(scheduled-event) ・・・
優先順位
サポートケースを登録する際に指定する優先順位の一覧です。
import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.DescribeSeverityLevelsRequest; import com.amazonaws.services.support.model.DescribeSeverityLevelsResult; import com.amazonaws.services.support.model.SeverityLevel; public class AWSSupportApp { public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); DescribeSeverityLevelsRequest request = new DescribeSeverityLevelsRequest(); request.withLanguage("ja"); DescribeSeverityLevelsResult result = support.describeSeverityLevels(request); for (SeverityLevel level : result.getSeverityLevels()) { System.out.println("優先順位 : " + level.getName() + "(" + level.getCode() + ")"); } } }
実行結果は以下です。
優先順位 : 低(low) 優先順位 : 標準(normal) 優先順位 : 高(high) 優先順位 : 緊急(urgent)
サポートケースの新規作成
import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.CreateCaseRequest; import com.amazonaws.services.support.model.CreateCaseResult; public class AWSSupportApp { public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); CreateCaseRequest request = new CreateCaseRequest() .withServiceCode("amazon-elastic-compute-cloud-linux") .withCategoryCode("feature-request") .withLanguage("ja") .withCcEmailAddresses("hogehoge@example.com") .withCommunicationBody("test support api from java programming") .withSubject("TEST SUPPORT") .withSeverityCode("low"); CreateCaseResult result = support.createCase(request); System.out.println("ケースID : "+ result.getCaseId()); } }
実行結果は以下です。
ケースID : case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bXXXX
サポートケースの一覧
import java.util.List; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.CaseDetails; import com.amazonaws.services.support.model.DescribeCasesRequest; import com.amazonaws.services.support.model.DescribeCasesResult; public class AWSSupportApp { public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); DescribeCasesRequest request = new DescribeCasesRequest() .withLanguage("ja") .withIncludeResolvedCases(true); DescribeCasesResult result = support.describeCases(request); List<CaseDetails> caseDetailsList = result.getCases(); for (CaseDetails caseDetails : caseDetailsList) { System.out.println("ケースID : " + caseDetails.getCaseId()); System.out.println(" 表示ID : " + caseDetails.getDisplayId()); System.out.println(" ステータス : " + caseDetails.getStatus()); System.out.println(" 題名 : " + caseDetails.getSubject()); } } }
実行結果は以下です。
ケースID : case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bXXXX 表示ID : 4369823 ステータス : resolved 題名 : ホゲホゲについて1 ケースID : case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bYYYY 表示ID : 4369833 ステータス : resolved 題名 : ホゲホゲについて2 ・・・
サポートケースを解決済みにする
import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.ResolveCaseRequest; import com.amazonaws.services.support.model.ResolveCaseResult; public class AWSSupportApp { private static String caseId = "case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bXXXX"; public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); ResolveCaseRequest request = new ResolveCaseRequest() .withCaseId(caseId); ResolveCaseResult result = support.resolveCase(request); System.out.println("Initial case status: " + result.getInitialCaseStatus()); System.out.println("Final case status: " + result.getFinalCaseStatus()); } }
実行結果は以下です。
Initial case status: reopened Final case status: resolved
Trusted Advisorに関するAPI
Trusted Advisorがチェックする項目一覧
import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.DescribeTrustedAdvisorChecksRequest; import com.amazonaws.services.support.model.DescribeTrustedAdvisorChecksResult; import com.amazonaws.services.support.model.TrustedAdvisorCheckDescription; public class AWSSupportApp { public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); DescribeTrustedAdvisorChecksRequest request = new DescribeTrustedAdvisorChecksRequest() .withLanguage("ja"); DescribeTrustedAdvisorChecksResult checks = support .describeTrustedAdvisorChecks(request); for (TrustedAdvisorCheckDescription check : checks.getChecks()) { System.out.println("ID : " + check.getId()); System.out.println(" カテゴリ : " + check.getCategory()); System.out.println(" 名前 : " + check.getName()); System.out.println(" メタデータ : " + check.getMetadata()); } } }
実行結果は以下です。
ID : 1MoPEMsKx6 カテゴリ : cost_optimizing 名前 : EC2 リザーブドインスタンスの最適化 メタデータ : [リージョン/AZ, インスタンスタイプ, OS, 有効なRI数(1年か3年), 先月のインスタンス利用数 最大/平均/最小, 1年間RI台数のお勧め, 請求の見積もり(本AZにおいてのみ), 前払い, 予想請求額(最適なRI数), 月毎の予想割引, リージョン/AZ, インスタンスタイプ, OS, 有効なRI数(1年か3年), 先月のインスタンス利用数 最大/平均/最小, 3年間RI台数のお勧め, 請求の見積もり(本AZにおいてのみ), 前払い, 予想請求額(最適なRI数), 月毎の予想割引] ID : HCP4007jGY カテゴリ : security 名前 : セキュリティグループ - 開かれたポート メタデータ : [リージョン, セキュリティグループ名, セキュリティグループID, プロトコル, ステータス, ポート] ID : iqdCTZKCUp カテゴリ : fault_tolerance 名前 : Elastic Load Balancer の最適化 メタデータ : [リージョン, ELB名, ゾーン数, ゾーン a 内インスタンス, ゾーン b 内インスタンス, ゾーン c 内インスタンス, ゾーン d 内インスタンス, ゾーン e 内インスタンス, ステータス, 理由] ・・・
Trusted Advisorのチェック結果
import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckResultRequest; import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckResultResult; import com.amazonaws.services.support.model.TrustedAdvisorCheckResult; public class AWSSupportApp { private static String checkId = "iqdCTZKCUp"; public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); DescribeTrustedAdvisorCheckResultRequest checkResultRequest = new DescribeTrustedAdvisorCheckResultRequest() .withCheckId(checkId); DescribeTrustedAdvisorCheckResultResult checkResult = support .describeTrustedAdvisorCheckResult(checkResultRequest); TrustedAdvisorCheckResult result = checkResult.getResult(); System.out.println("チェックID : " + result.getCheckId()); System.out.println(" ステータス : " + result.getStatus()); System.out.println(" カテゴリーサマリー : " + result.getCategorySpecificSummary()); System.out.println(" リソースサマリー : " + result.getResourcesSummary()); System.out.println(" リソース詳細 : " + result.getFlaggedResources()); } }
実行結果は以下です。
チェックID : iqdCTZKCUp ステータス : warning カテゴリーサマリー : {CostOptimizing: {EstimatedMonthlySavings: 0.0,EstimatedPercentMonthlySavings: 0.0}} リソースサマリー : {ResourcesProcessed: 2,ResourcesFlagged: 2,ResourcesIgnored: 0,ResourcesSuppressed: 0} リソース詳細 : [{Status: warning,Region: ap-northeast-1,ResourceId: hpieQxCif67yD9jZpxC1--7Ccy80smINC0pXf2C82fs,IsSuppressed: false,Metadata: [ap-northeast-1, awseb-e-h-AWSEBLoa-S59KFWFPRRR1, 3, 0, 1, 0, 0, 0, Yellow, Single AZ]}, {Status: warning,Region: ap-northeast-1,ResourceId: Q9lZLAh_vTFu_D7AVBdSEQY4WjQNZTpskIgOis70Gok,IsSuppressed: false,Metadata: [ap-northeast-1, jmeter, 1, 0, 1, 0, 0, 0, Yellow, Single AZ]}]
Trusted Advisorによるチェック進捗
import java.util.List; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.support.AWSSupportClient; import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckRefreshStatusesRequest; import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckRefreshStatusesResult; import com.amazonaws.services.support.model.TrustedAdvisorCheckRefreshStatus; public class AWSSupportApp { private static String checkId = "iqdCTZKCUp"; public static void main(String[] args) { AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider(); AWSSupportClient support = new AWSSupportClient(credentialsProvider); DescribeTrustedAdvisorCheckRefreshStatusesRequest request = new DescribeTrustedAdvisorCheckRefreshStatusesRequest() .withCheckIds(checkId); DescribeTrustedAdvisorCheckRefreshStatusesResult result = support.describeTrustedAdvisorCheckRefreshStatuses(request); List<TrustedAdvisorCheckRefreshStatus> list = result.getStatuses(); for (TrustedAdvisorCheckRefreshStatus status : list) { System.out.println("チェックID : " + status.getCheckId()); System.out.println(" ステータス : " + status.getStatus()); System.out.println(" 次の更新まで : " + status.getMillisUntilNextRefreshable()); } } }
実行結果は以下です。
チェックID : iqdCTZKCUp ステータス : success 次の更新まで : 115049
まとめ
AWSサポートが画面で提供しているSupport CaseとTrusted Advisorの機能に関して、ほぼ全ての情報にアクセスできることが分かりました。これでサポートに関してシステム間連携もできますね。そのうち、よくある質問内容に関してコード番号が振られて、AWSサポートの方々が手作業でチェックしなくても、自動で確認して回答できるようになるのではと期待しています。